package com.runtu.infrastructure.adapter.repository;

import com.runtu.domain.tag.adapter.repository.ITagRepository;
import com.runtu.domain.tag.model.entity.CrowdTagsJobEntity;
import com.runtu.infrastructure.dao.ICrowdTagsDao;
import com.runtu.infrastructure.dao.ICrowdTagsDetailDao;
import com.runtu.infrastructure.dao.ICrowdTagsJobDao;
import com.runtu.infrastructure.dao.po.CrowdTags;
import com.runtu.infrastructure.dao.po.CrowdTagsDetail;
import com.runtu.infrastructure.dao.po.CrowdTagsJob;
import com.runtu.infrastructure.redis.IRedisService;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

/**
 * @ClassName TagRepository
 * @Description TODO
 * @date 2025/7/20 23:15
 * @Version 1.0
 */
@Repository
public class TagRepository implements ITagRepository {
    /*和数据库交互 开始操作！！ action*/
    @Resource
    private ICrowdTagsDao crowdTagsDao;
    @Resource
    private ICrowdTagsJobDao crowdTagsJobDao;
    @Resource
    private ICrowdTagsDetailDao crowdTagsDetailDao;

    /*注入redis的工具类*/
    @Resource
    private IRedisService redisService;




    @Override
    public CrowdTagsJobEntity queryCrowdTagsJobEntity(String tagId, String batchId) {
        CrowdTagsJob crowdTagsJob=new CrowdTagsJob();
        crowdTagsJob.setTagId(tagId);
        crowdTagsJob.setBatchId(batchId);

        /*查出来的是数据库的PO对象*/
        CrowdTagsJob crowdTagsJobRes = crowdTagsJobDao.queryCrowdTagsJob(crowdTagsJob);
        if (null == crowdTagsJobRes) return null;

        /*转换对象*/
/*      CrowdTagsJobEntity crowdTagsJobEntity=new CrowdTagsJobEntity();
        crowdTagsJobEntity.setTagRule(crowdTagsJobRes.getTagRule());
        crowdTagsJobEntity.setStatStartTime(crowdTagsJobRes.getStatStartTime());
        crowdTagsJobEntity.setTagRule(crowdTagsJobRes.getTagRule());
        crowdTagsJobEntity.setStatEndTime(crowdTagsJobRes.getStatEndTime());

        return crowdTagsJobEntity;
        */

        /*转换过程等价于以下语句*/
        return CrowdTagsJobEntity.builder()
                .tagType(crowdTagsJobRes.getTagType())
                .tagRule(crowdTagsJobRes.getTagRule())
                .statStartTime(crowdTagsJobRes.getStatStartTime())
                .statEndTime(crowdTagsJobRes.getStatEndTime())
                .build();

    }

    @Override
    public void addCrowdTagsUserId(String tagId, String userId) {

        /*用数据库*/
        CrowdTagsDetail crowdTagsDetailReq = new CrowdTagsDetail();
        crowdTagsDetailReq.setTagId(tagId);
        crowdTagsDetailReq.setUserId(userId);


        try {
            crowdTagsDetailDao.addCrowdTagsUserId(crowdTagsDetailReq);

            /* 获取BitSet*//*redisService.getBitSet(tagId) 会创建一个 Redis 键（Key）*/
            RBitSet bitSet = redisService.getBitSet(tagId);
            /*存到redis里面 但是为了更散列 提前用了一个工具类 先转换一下*/
            bitSet.set(redisService.getIndexFromUserId(userId),true);/*将位图中对应用户的位置设为 1（true），表示用户属于该标签。*/
            System.out.println("good");


        }catch (DuplicateKeyException ignore){
            // 忽略唯一索引冲突

        }

    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, int size ){
        CrowdTags crowdTagsReq=new CrowdTags();
        crowdTagsReq.setTagId(tagId);
        crowdTagsReq.setStatistics(size);

        crowdTagsDao.updateCrowdTagsStatistics(crowdTagsReq);

    }
}
